#ifndef IGSLIB_IMETER_H
#define IGSLIB_IMETER_H
#include "igslib_common_use.h"
#include "igslib_iserial_manager.h"
#include <map>
#include "igslib_igpio.h"
namespace igslib
{
    struct IMeterEvent
    {
        /*!
         * 當碼表的值發生變化時觸發。
         * @param a0 舊值。
         * @param a1 新值。
         */
        virtual void OnValueChange(float,float)=0;
    };
	struct IMeter:public IComponent
	{
        /*!
         * 設定碼表相關事件處理者。
         * @param a0 相關事件處理者。
         */
        virtual void SetEventHandler(IMeterEvent*)=0;
        /*!
         * 增加碼表的值。
         * @param a0 要增加的值。
         * @return
         *     0: 操作正常。
         *     -1: 超過實作範圍。
         */
		virtual int AddValue(const float&)=0;
        /*!
         * 取得碼表的值。
         * @param a0 要增加的值。
         */
		virtual float GetValue()=0;
		/*!
         * 重置碼表。
         */
		virtual void Reset()=0;
        /*!
         * 更新碼表狀態。
         */
		virtual void Update()=0;
		 /*!
         * 取得碼表名。
         * @return 碼表名。
         */
		virtual std::string GetName()=0;		
		 /*!
         * 設定是否以active high準位。
         * @param a0 true表示要以 active high 準位 預設是以low準位來認定。
         */
		virtual void SetHighActive(const bool&)=0;
        /*!
         * 若實作是使用SPI通訊介面，用此函式輸入SPI的實作。
         * @param a0 SPI的實作。
         */
        virtual void SetSPI(ISpi*)=0;
	};

    struct IGPIOMeter:virtual public IMeter
    {
		/*!
         * 若實作是使用GPIO通訊介面，用此函式輸入GPIO的實作。
         * @param a0 GPIO的實作
		 *			-- Counter 使用板子的接腳。
         * @return
         *     0: 操作正常。
         *     -1: 參數錯誤。
         */
		virtual int SetGPIO(IGPIO*)=0; 
		 /*!
         * 設定Counter 工作時序
         * @param a0 Action time     (set time)  unit: ms。
         * @param a1 Non-action time (hold time) time  unit: ms。
         * @return
         *     0: 操作正常。
         *     -1: 超過實作範圍。
		 *							N-Act
		 *  ________             _____________               ________
		 *          |           |             |             | 
		 *          |           |             |             |
		 *          |___________|             |_____________|
		 *			     Act
         */
		virtual int SetDutyRange(const float&,const float&)=0; 
    };
    struct IMeterManager:public IManager<IMeter*>
    {
        /*!
         * 創建一個MH板底適用的碼表。
         * @return 創建出來的碼表。
         */
        virtual IMeter* NewMHMeter()=0;
		/*!
         * 創建MH主板上根據專案特規實作MCU資源。
         * @param a0 專案名。
         * @return 根據專案特規實作MCU資源。
         * @note
         *     目前已實作專案名對照如下：
         *     "DragonBallRace"：龍珠賽球
         *     "DragonWarrior"：鬥龍戰士
         */
        virtual IGPIOMeter* New_ProjGPIOMeter(const std::string&)=0;
    };
};
extern "C"{
    igslib::IMeterManager* GetMeterManagerInstance();
};

#endif
